/*
 * 版权所有(C)，方太互联网应用技术部，lizhixing，所有权利保留。
 * <p>
 * 项目名：	algorithm-demo
 * 文件名：	Question008
 * 模块说明：
 * 修改历史：
 * 2025/1/14 - lizhixing - 创建。
 */
package com.lovely602.algorithm.wansuanfa;


/**
 * 把一个字符串s转化为整数，前面如果有空格要去掉，还要注意正负号，读入下一个字符， 直到到达下一个非数字字符或到达输入的结尾，字符串的其余部分将被忽略。
 * <p>
 * 如果整数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ，需要截断这个整数，使其保持在这个范围内。 具体来说，小于 −2^31 的整数应该被固定为 −2^31 ，大于
 * 2^31 − 1 的整数应该被固定为 2^31 − 1 。
 * <p>
 * 示例1： 输入：s = "   -42"
 * <p>
 * 输出：-42
 * <p>
 * 解释："   -42"（读入前导空格，但忽视掉）
 * <p>
 * 示例2： 输入：s = "4193 with words"
 * <p>
 * 输出：4193
 * <p>
 * 解释："4193 with words"（读入 "4193"；由于下一个字符不是一个数字，所以读入停止），解析得到整数 4193 。
 * <p>
 * 0 <= s.length <= 200
 * <p>
 * s 由英文字母（大写和小写）、数字（0-9）、' '、'+'、'-' 和 '.' 组成
 * <p>
 * * @author lizhixing
 */
public class Question008 {


  public static void main(String[] args) {
    int atoi = new Question008().myAtoi(" -4193 with words");
    System.out.println(atoi);
  }

  public int myAtoi(String str) {
    str = str.trim();// 去掉前后的空格
    if (str.length() == 0)
      return 0;
    int num = 0;// 最终结果
    int index = 0;// 遍历字符串中字符的位置
    int sign = 1;// 符号，1是正数，-1是负数，默认为正数
    int length = str.length();
    // 判断符号
    if (str.charAt(index) == '-' || str.charAt(index) == '+')
      sign = str.charAt(index++) == '+' ? 1 : -1;
    for (; index < length; ++index) {
      // 取出字符串中字符，然后转化为数字
      int digit = str.charAt(index) - '0';
      // 按照题中的要求，读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。
      // 字符串的其余部分将被忽略。如果读取了非数字，后面的都要忽略。
      if (digit < 0 || digit > 9)
        break;
      // 越界处理
      if (num > Integer.MAX_VALUE / 10 ||
          (num == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10))
        return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
      else
        num = num * 10 + digit;
    }
    return sign * num;
  }


}
